#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

// 自定义栈结构体
typedef struct
{
    //======Begin======
    int *bottom; // 指向栈底（动态数组的起始地址）
    int count;   // 当前栈中元素个数
    int size;    // 栈的最大容量
    //=======End=======
} CustomStack;

/**
 * 创建自定义栈
 * @param maxSize 栈的最大容量
 * @return 指向创建的栈的指针
 */
CustomStack *customStackCreate(int maxSize)
{
    //======Begin======
    CustomStack *s = (CustomStack *)malloc(sizeof(CustomStack));
    if (s == NULL)
        return NULL;

    s->count = 0;      // 初始元素个数为0
    s->size = maxSize; // 设置栈的最大容量

    // 分配栈空间
    s->bottom = (int *)calloc(s->size, sizeof(int));
    if (s->bottom == NULL)
    {
        free(s);
        return NULL;
    }
    return s;
    //=======End=======
}

/**
 * 元素入栈
 * @param obj 栈指针
 * @param x   要入栈的元素值
 */
void customStackPush(CustomStack *obj, int x)
{
    //======Begin======
    assert(obj != NULL);
    // 如果栈未满，将元素放入栈顶位置
    if (obj->count < obj->size)
    {
        obj->bottom[obj->count++] = x;
    }
    //=======End=======
}

/**
 * 元素出栈
 * @param obj 栈指针
 * @return 栈顶元素值（栈空时返回-1）
 */
int customStackPop(CustomStack *obj)
{
    //======Begin======
    assert(obj != NULL);
    if (obj->count > 0)
    {
        return obj->bottom[--obj->count];
    }
    return -1; // 栈空返回-1
    //=======End=======
}

/**
 * 栈底增量操作
 * @param obj  栈指针
 * @param k    要增加元素的数量（从栈底开始）
 * @param val  增加的值
 */
void customStackIncrement(CustomStack *obj, int k, int val)
{
    //======Begin======
    assert(obj != NULL);
    // 确定实际需要增加的元素数量
    int n = k < obj->count ? k : obj->count;
    for (int i = 0; i < n; i++)
    {
        obj->bottom[i] += val;
    }
    //=======End=======
}

/**
 * 释放栈内存
 * @param obj 栈指针
 */
void customStackFree(CustomStack *obj)
{
    //======Begin======
    if (obj == NULL)
        return;
    free(obj->bottom);
    free(obj);
    //=======End=======
}